home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / SECURITY / 0058.ZIP / CRYPT1.BAS < prev    next >
BASIC Source File  |  1984-04-14  |  15KB  |  265 lines

  1. 1000 ' PC-CRYP1.BAS
  2. 1010 ' WARNING!!! DO NOT ALTER, BYPASS OR REMOVE LINES 1000-1320
  3. 1020 CLS: CLEAR ,,512: KEY OFF: WIDTH 80: SCREEN 0,0,0: COLOR 7,0,0: LOCATE ,,0
  4. 1030 PRINT TAB(16) STRING$(15,45)" U S E R W A R E "STRING$(15,45)
  5. 1040 PRINT: PRINT TAB(28)"USER-SUPPORTED SOFTWARE": PRINT
  6. 1050 RESTORE 1060: FOR I.I%=1 TO 15: READ S.S$: PRINT SPC(8)S.S$: NEXT I.I%
  7. 1060 DATA"    IF YOU USE THE PC-CRYP1 PROGRAM AND FIND IT OF VALUE,
  8. 1070 DATA"    YOUR CONTRIBUTION ($5 SUGGESTED) WILL BE APPRECIATED.",""
  9. 1080 DATA"            COPYRIGHT (C) 1984 BY JAMES T. DEMBERGER
  10. 1090 DATA"                     7280 60TH AVENUE NORTH,
  11. 1100 DATA"                    ST. PETERSBURG, FL 33709
  12. 1110 DATA"                          813-546-1182
  13. 1120 DATA"                     COMPUSERVE 74425,1642",""
  14. 1130 DATA"YOU ARE ENCOURAGED TO COPY AND SHARE THIS PROGRAM WITH OTHER USERS,
  15. 1140 DATA"ON THE CONDITIONS THAT THE PROGRAM IS NOT DISTRIBUTED IN MODIFIED
  16. 1150 DATA"FORM, THAT NO FEE OR CONSIDERATION IS CHARGED, AND THAT THIS NOTICE
  17. 1160 DATA"IS NOT BYPASSED OR REMOVED.  COMMERCIAL USE OF THIS PROGRAM, IN
  18. 1170 DATA"WHOLE OR IN PART, OR DERIVATIVE VERSIONS OF THIS PROGRAM, IN WHOLE
  19. 1180 DATA"OR IN PART, IS PROHIBITED WITHOUT PERMISSION OF THE AUTHOR.
  20. 1190 GOSUB 1450: CLS: PRINT SPC(36)"PC-CRYP1": PRINT
  21. 1200 PRINT SPC(28)"VERSION 3.1  30 JAN 1984": PRINT
  22. 1210 FOR I.I%=1 TO 8: READ S.S$: PRINT SPC(10)S.S$: NEXT I.I%: PRINT
  23. 1220 DATA"PROGRAM DESCRIPTION AND RUN INSTRUCTIONS ARE ON DISKETTE WITH
  24. 1230 DATA"A FILENAME OF PC-CRYP1.DOC.  A DISKETTE WITH THE BASIC PROGRAM
  25. 1240 DATA"PC-CRYP1.BAS, THE COMPILED PROGRAM PC-CRYP1.EXE AND THE DOCUMENTION
  26. 1250 DATA"FILE PC-CRYP1.DOC IS AVAILABLE FROM THE AUTHOR FOR $10.00.",""
  27. 1260 DATA"INTERPRETED BASIC HAS AN ENCRYPTION OR DECRYPTION THRUPUT OF
  28. 1270 DATA"APPROXIMATELY 12 CHARACTERS PER SECOND WHILE COMPILED BASIC
  29. 1280 DATA"HAS A THRUPUT OF MORE THAN 350 CHARACTERS PER SECOND.
  30. 1290 DIM C.S$(1): I.I%=VARPTR(C.S$(1))-VARPTR(C.S$(0))
  31. 1300 IF I.I%=4 THEN S.S$="COMPILED" ELSE S.S$="INTERPRETED"
  32. 1310 PRINT SPC(18)"PC-CRYP1 IS RUNNING AS ";S.S$;" BASIC.": GOSUB 1450: CLS
  33. 1320 ' MERGE ALL LINES FROM HERE THRU LINE READING "END OF MERGE STATEMENTS"
  34. 1330 '       INTO ANY PROGRAM USING SUBROUTINES FROM THIS PROGRAM
  35. 1340 ON ERROR GOTO 1510: DIM C.LST%(103),T.REC$(10): TRU.ON%=-1: FAL.OF%=0
  36. 1350 CTR.SET$="*C_T_R  R_E_S_E_T*": GOSUB 2140: GOTO 1700
  37. 1360 PRINT SPC(15)"USE LOWER CASE TO UPPER CASE CONVERT? Y/N ";: GOSUB 1460
  38. 1370 U.C%=FAL.OF%: IF N.N%=89 THEN U.C%=TRU.ON%: RETURN ELSE RETURN
  39. 1380 PRINT SPC(15)"USE SPACE TO ^(94) & ~(126) CONVERT? Y/N ";: GOSUB 1460
  40. 1390 S.C%=TRU.ON%: IF N.N%=78 THEN S.C%=FAL.OF%: RETURN ELSE RETURN
  41. 1400 LOCATE 25,26: PRINT"PRESS ESC TO RETURN TO MENU";: LOCATE I.ROW%,1: RETURN
  42. 1410 FOR I.I%=1 TO LEN(STR.IN$): J.J%=ASC(MID$(STR.IN$,I.I%,1))
  43. 1420 IF J.J%>96 AND J.J%<123 THEN J.J%=J.J%-32: MID$(STR.IN$,I.I%,1)=CHR$(J.J%)
  44. 1430 NEXT I.I%: RETURN
  45. 1440 PRINT SPC(25)"SET PAPER TO TOP-OF-PAGE"
  46. 1450 PRINT: PRINT SPC(25)"PRESS ANY KEY TO CONTINUE ";
  47. 1460 DEF SEG=0: POKE 1050,PEEK(1052): DEF SEG: POKE 106,0: COLOR 23,0: BEEP
  48. 1470 PRINT"_";: LOCATE ,POS(0)-1: COLOR 7,0: S.TR$=INPUT$(1): N.N%=ASC(S.TR$)
  49. 1480 I.E%=0: IF N.N%<123 AND N.N%>96 THEN N.N%=N.N% XOR 32
  50. 1490 IF N.N%=27 THEN I.E%=-1: N.N%=32 ELSE IF N.N%<32 THEN N.N%=32
  51. 1500 S.TR$=CHR$(N.N%): PRINT S.TR$: PRINT: RETURN
  52. 1510 CLOSE: IF ERL=3060 THEN GOSUB 1560: RESUME 3040
  53. 1520 IF ERL=3090 THEN GOSUB 1560: RESUME 3070
  54. 1530 PRINT: PRINT SPC(25)"ERROR ";ERR;" AT LINE ";ERL: RESUME 1540
  55. 1540 PRINT: PRINT SPC(25)"WANT TO CONTINUE OR END PROGRAM? C/E ";: GOSUB 1460
  56. 1550 IF S.TR$="C" THEN 1720 ELSE 1830
  57. 1560 PRINT: PRINT SPC(25)"FILE NOT FOUND OR BAD FILE NAME": RETURN
  58. 1570 I.COLH%=POS(0): STR.IN$=""
  59. 1580 COLOR 23,0: PRINT"_";: COLOR 7,0
  60. 1590 CHR.IN$=INKEY$: IF CHR.IN$="" THEN 1590 ELSE CHR.IN%=ASC(CHR.IN$)
  61. 1600 LOCATE ,POS(0)-1: IF CHR.IN%>31 THEN PRINT CHR.IN$;: GOTO 1630
  62. 1610 IF CHR.IN%=8 THEN 1640 ELSE IF CHR.IN%=13 OR CHR.IN%=27 THEN 1670
  63. 1620 IF CHR.IN%=7 THEN PRINT CHR$(126);: GOTO 1630 ELSE PRINT" ";
  64. 1630 STR.IN$=STR.IN$+CHR.IN$: IF LEN(STR.IN$)>=78 THEN 1670 ELSE 1580
  65. 1640 IF LEN(STR.IN$)<1 THEN LOCATE ,I.COLH%: GOTO 1580
  66. 1650 LOCATE ,POS(0)-1: PRINT"  ";: LOCATE ,POS(0)-2
  67. 1660 STR.IN$=LEFT$(STR.IN$,LEN(STR.IN$)-1): GOTO 1580
  68. 1670 PRINT" ": LOCATE CSRLIN,1: RETURN
  69. 1680 PRINT"ENTER RECORD ";L.L%;
  70. 1690 PRINT"- MAXIMUM 78 CHARS - PRESS ESC TO END KEYBOARD INPUT": BEEP: RETURN
  71. 1700 CLS
  72. 1710 ' END OF MERGE STATEMENTS
  73. 1720 CLS: IF TIM.SW% THEN GOSUB 2540
  74. 1730 PRINT: PRINT SPC(34)"PC-CRYP1 MENU": PRINT
  75. 1740 PRINT SPC(26)"P  SELECT A NEW PASSWORD"
  76. 1750 PRINT SPC(26)"F  PROCESS DISKETTE FILES"
  77. 1760 PRINT SPC(26)"S  ENCRYPT & DECRYPT TEST STRINGS"
  78. 1770 PRINT SPC(26)"T  TURN TIMER OFF/ON"
  79. 1780 PRINT SPC(26)"X  EXIT/END PROGRAM"
  80. 1790 PRINT: PRINT SPC(30)"ENTER OPTION LETTER ";
  81. 1800 GOSUB 1460: OPT.SEL%=INSTR("SFPTXM",S.TR$)
  82. 1810 ON OPT.SEL% GOSUB 2610,3030,2140,2550,1830,1840
  83. 1820 GOTO 1720
  84. 1830 CLS: PRINT SPC(35)"END PC-CRYP1": END
  85. 1840 PRINT SPC(35)"FREE=";FRE(""): GOSUB 1450: RETURN
  86. 1850 '      ENCRYPT/DECRYPT SUBROUTINE
  87. 1860 ' NOTE: CTR.SET% MUST BE SET = 1 FOR FIRST STRING TO BE EN/DECRYPT
  88. 1870 ' INPUT: ED.IN$=[CHARACTER STRING TO BE EN/DECRYPT]
  89. 1880 ' OUTPUT: ED.OUT$=[EN/DECRYPT CHARACTER STRING]
  90. 1890 ' SUBROUTINE USES VALUES IN ARRAY C.LST%(CTR.[1,2,3]%)
  91. 1900 ED.SW%=TRU.ON%                            'ENTRY LINE FOR ENCRYPTION
  92. 1910 ED.OUT$="": ON CTR.SET%+1 GOTO 1930,2080  'ENTRY LINE FOR DECRYPTION
  93. 1920 PRINT"CTR.SET% NOT 0 OR 1": GOSUB 1450: GOTO 1720
  94. 1930 FOR I.I%=1 TO LEN(ED.IN$): CHR.COD%=ASC(MID$(ED.IN$,I.I%,1))
  95. 1940 IF CHR.COD%=7 THEN 2090 ELSE IF CHR.COD%<32 THEN 2060
  96. 1950 IF ESC.COD% THEN 2060 ELSE IF NOT ED.SW% THEN 2000
  97. 1960 IF CHR.COD%=32 THEN IF S.C% THEN 1980 ELSE 2000
  98. 1970 IF U.C% THEN 1990 ELSE 2000
  99. 1980 IF LST.CHR%<96 THEN CHR.COD%=94 ELSE CHR.COD%=126: GOTO 2000
  100. 1990 IF CHR.COD%<97 OR CHR.COD%>122 THEN 2000 ELSE CHR.COD%=CHR.COD% XOR 32
  101. 2000 CHR.COD%=CHR.COD% XOR C.LST%(CTR.1%) XOR C.LST%(CTR.2%) XOR C.LST%(CTR.3%)
  102. 2010 CTR.1%=CTR.1%+1: IF CTR.1%>97 THEN CTR.1%=1
  103. 2020 CTR.2%=CTR.2%+1: IF CTR.2%>101 THEN CTR.2%=1
  104. 2030 CTR.3%=CTR.3%+1: IF CTR.3%>103 THEN CTR.3%=1
  105. 2040 IF ED.SW% THEN 2060
  106. 2050 IF S.C% THEN IF CHR.COD%=94 OR CHR.COD%=126 THEN CHR.COD%=32
  107. 2060 ED.OUT$=ED.OUT$+CHR$(CHR.COD%): LST.CHR%=CHR.COD%
  108. 2070 NEXT I.I%: ED.SW%=0: RETURN
  109. 2080 CTR.1%=CTRH.1%: CTR.2%=CTRH.2%: CTR.3%=CTRH.3%: CTR.SET%=0: GOTO 1930
  110. 2090 IF ESC.COD% THEN ESC.COD%=FAL.OF%: GOTO 2060
  111. 2100 ESC.COD%=TRU.ON%: GOTO 2060
  112. 2110 '      SELECT NEW PASSWORD
  113. 2120 ' INPUT:  PASSWORD
  114. 2130 ' OUTPUT: CODE VALUES IN C.LST% ARRAY
  115. 2140 CLS: PRINT SPC(30)"SELECT NEW PASSWORD": PRINT
  116. 2150 PRINT SPC(18)"PRESS V FOR A VISIBLE DISPLAY OF PASSWORD OR"
  117. 2160 PRINT SPC(22)"PRESS ENTER FOR NON-VISIBLE DISPLAY ";
  118. 2170 GOSUB 1460: IF N.N%=86 THEN F.G%=7 ELSE F.G%=0: PRINT
  119. 2180 PRINT SPC(25)"OLD PASSWORD IS    ";: COLOR F.G%: PRINT P.WD$: COLOR 7
  120. 2190 PRINT: PRINT SPC(25)"ENTER NEW PASSWORD ";: COLOR F.G%
  121. 2200 LINE INPUT P.WX$: COLOR 7: IF P.WX$="" AND P.WD$="" THEN 2190
  122. 2210 PRINT: IF P.WX$="" AND LEN(P.WD$)>0 THEN 2350 ELSE P.WD$=P.WX$
  123. 2220 IF LEN(P.WX$)<11 THEN P.WX$=P.WX$+P.WX$: GOTO 2220
  124. 2230 FOR I.I%=1 TO 11: C.LST%(I.I%)=(ASC(MID$(P.WX$,I.I%,1))-8) MOD 10
  125. 2240 NEXT I.I%: R.G#=0
  126. 2250 FOR I.I%=1 TO 5: R.G#=R.G#+C.LST%(I.I%)*(10^(5-I.I%)): NEXT I.I%
  127. 2260 IF R.G#>32767 THEN R.G#=R.G#-10000: GOTO 2260
  128. 2270 CTRH.1%=C.LST%(6)*10+C.LST%(7)
  129. 2280 CTRH.2%=C.LST%(8)*10+C.LST%(9): CTRH.3%=C.LST%(10)*10+C.LST%(11)
  130. 2290 PRINT SPC(25)"CODE LIST FOR PASSWORD ";: COLOR F.G%: PRINT P.WD$: COLOR 7
  131. 2300 PRINT: FOR M.M%=1 TO 103
  132. 2310 R.G#=(R.G#*997)+32771!: R.G#=R.G#-(INT(R.G#/32768!)*32768!)
  133. 2320 I.I%=FIX(R.G#/10) MOD 32: C.LST%(M.M%)=I.I%: PRINT USING"##";I.I%;
  134. 2330 IF M.M%=103 THEN 2350 ELSE IF M.M% MOD 26 THEN PRINT","; ELSE PRINT
  135. 2340 NEXT M.M%
  136. 2350 PRINT: GOSUB 1450: RETURN
  137. 2360 '      TIMER SUBROUTINE
  138. 2370 TIM.SE%=TRU.ON% 'ENTRY LINE FOR START, NEXT LINE ENTRY LINE FOR END TIME
  139. 2380 DEF SEG=64: T.H#=PEEK(110): T.M#=PEEK(109): T.S#=PEEK(108): DEF SEG
  140. 2390 T.R#=(T.H#*65536!)+(T.M#*256)+T.S#
  141. 2400 ' REM 2 PRECEEDING LINES AND DE-REM NEXT LINE IF CLOCK CAN NOT BE PEEKED
  142. 2410 'T.R#=VAL(MID$(TIME$,1,2))*3600+VAL(MID$(TIME$,4,2))*60+VAL(MID$(TIME$,7,2))
  143. 2420 IF NOT TIM.SE% THEN 2440
  144. 2430 TIM.SE%=FAL.OF%: T.X#=T.R#: RETURN
  145. 2440 T.T#=T.T#+T.R#-T.X#: RETURN
  146. 2450 T.T#=T.T#*.0549255+.001 'ENTRY LINE DISPLAY ACCUMULATED TIME
  147. 2460 ' REM PRECEEDING LINE AND DE-REM FOLLOWING LINE IF CLOCK CAN NOT BE PEEKED
  148. 2470 'IF T.T#=<1 THEN T.T#=.1 'ENTRY LINE DISPLAY ACCUMULATED TIME
  149. 2480 T.H#=FIX(T.T#/3600): T.S#=T.T#-T.H#*3600
  150. 2490 T.M#=FIX(T.S#/60): T.S#=T.S#-T.M#*60
  151. 2500 PRINT: PRINT USING"TOTAL TIME ## HOURS ## MINUTES ";T.H#;T.M#;
  152. 2510 PRINT USING"##.### SECONDS";T.S#
  153. 2520 PRINT USING"TOTAL CHARACTERS ###,###    ";NO.CHAR!;
  154. 2530 PRINT USING"CHARACTERS PER SECOND ####.##"; NO.CHAR!/T.T#
  155. 2540 NO.CHAR!=0: T.T#=0: RETURN
  156. 2550 PRINT SPC(34)"TIMER IS ";
  157. 2560 IF TIM.SW% THEN PRINT"ON" ELSE PRINT"OFF"
  158. 2570 PRINT: PRINT SPC(14)"PRESS O FOR TIMER ON - PRESS F FOR TIMER OFF - O/F ";
  159. 2580 GOSUB 1460: IF N.N%=79 THEN TIM.SW%=TRU.ON% ELSE TIM.SW%=FAL.OF%
  160. 2590 RETURN
  161. 2600 '      TEST STRINGS
  162. 2610 CLS: PRINT SPC(25)"ENCRYPT & DECRYPT TEST STRINGS": S.TR$=" STRING OF "
  163. 2620 PRINT: PRINT SPC(20)"A"+S.TR$+"CHARACTERS WITH ASCII CODES 32 TO 127"
  164. 2630 PRINT SPC(20)"B"+S.TR$+"CHARACTERS WITH ASCII CODES  0 TO 127"
  165. 2640 PRINT SPC(20)"C"+S.TR$+"100 CHARACTER _"
  166. 2650 PRINT SPC(20)"D"+S.TR$+"CHARACTERS ENTERED FROM KEYBOARD": PRINT
  167. 2660 PRINT SPC(26)"PRESS ESC TO RETURN TO MENU"
  168. 2670 PRINT: PRINT SPC(30)"ENTER OPTION LETTER ";: GOSUB 1460: IF I.E% THEN 2710
  169. 2680 NO.REC%=10: OPT.SEL%=INSTR("ABCD",S.TR$): IF OPT.SEL%=0 THEN 2610
  170. 2690 GOSUB 1360: IF I.E% THEN 2710
  171. 2700 GOSUB 1380: IF I.E% THEN 2710 ELSE ON OPT.SEL% GOTO 2740,2740,2720,2760
  172. 2710 RETURN
  173. 2720 PRINT SPC(30)"ENTER CHARACTER ";: GOSUB 1460: IF I.E% THEN 2710
  174. 2730 CHR.IN$=S.TR$
  175. 2740 PRINT SPC(15)"NUMBER OF RECORDS TO ENCRYPT - 10 OR LESS ";: BEEP
  176. 2750 INPUT"",S.TR$: NO.REC%=VAL(S.TR$): IF NO.REC%<1 OR NO.REC%>10 THEN 2740
  177. 2760 CLS: FOR L.L%=1 TO NO.REC%: ON OPT.SEL% GOTO 2820,2820,2810,2770
  178. 2770 GOSUB 1680: T.REC$(L.L%)="": GOSUB 1570: T.REC$(L.L%)=STR.IN$: GOSUB 2790
  179. 2780 IF CHR.IN%=27 THEN NO.REC%=L.L%-1: GOTO 2900 ELSE 2870
  180. 2790 LOCATE CSRLIN-2,1: PRINT SPACE$(79): PRINT SPACE$(79)
  181. 2800 LOCATE CSRLIN-2,1: RETURN
  182. 2810 T.REC$(L.L%)=STRING$(100,CHR.IN$): GOTO 2870
  183. 2820 IF OPT.SEL%=1 THEN J.J%=32 ELSE J.J%=0
  184. 2830 T.REC$(L.L%)="": FOR K.K%=J.J% TO 127
  185. 2840 T.REC$(L.L%)=T.REC$(L.L%)+CHR$(K.K%)
  186. 2850 IF K.K%=7 THEN T.REC$(L.L%)=T.REC$(L.L%)+CHR$(K.K%)
  187. 2860 NEXT K.K%
  188. 2870 PRINT USING"REC NO ## CLEAR TEXT";L.L%: PRINT T.REC$(L.L%)
  189. 2880 NEXT L.L%
  190. 2890 '      DISPLAY ROUTINE
  191. 2900 CTR.SET%=1: FOR L.L%=1 TO NO.REC%
  192. 2910 PRINT USING"REC NO ## ENCRYPT TEXT";L.L%
  193. 2920 ED.IN$=T.REC$(L.L%): IF TIM.SW% THEN GOSUB 2370
  194. 2930 GOSUB 1900: IF TIM.SW% THEN GOSUB 2380
  195. 2940 T.REC$(L.L%)=ED.OUT$: PRINT T.REC$(L.L%): NEXT L.L%
  196. 2950 CTR.SET%=1: FOR L.L%=1 TO NO.REC%
  197. 2960 PRINT USING"REC NO ## DECRYPT TEXT";L.L%
  198. 2970 IF NOT TIM.SW% THEN 2990
  199. 2980 NO.CHAR!=NO.CHAR!+LEN(T.REC$(L.L%))*2: GOSUB 2370
  200. 2990 ED.IN$=T.REC$(L.L%): GOSUB 1910: IF TIM.SW% THEN GOSUB 2380
  201. 3000 PRINT ED.OUT$: NEXT L.L%: IF TIM.SW% THEN GOSUB 2450
  202. 3010 GOSUB 1450: CLS: GOTO 2610
  203. 3020 '      PROCESS FILES
  204. 3030 CLS: PRINT SPC(33)"PROCESS FILES": I.ROW%=CSRLIN: GOSUB 1400
  205. 3040 PRINT: PRINT SPC(15)"ENTER INPUT  DR:FILENAME.EXT OR KEYBD  ";: BEEP
  206. 3050 GOSUB 1570: IF CHR.IN%=27 THEN 3200 ELSE GOSUB 1410
  207. 3060 FIL.IN$=STR.IN$: IF FIL.IN$="KEYBD" THEN 3070 ELSE OPEN "I",1,FIL.IN$
  208. 3070 PRINT: PRINT SPC(15)"ENTER OUTPUT DR:FILENAME.EXT OR NOFILE ";: BEEP
  209. 3080 GOSUB 1570: IF CHR.IN%=27 THEN 3200 ELSE GOSUB 1410
  210. 3090 FIL.OUT$=STR.IN$: IF FIL.OUT$="NOFILE" THEN 3100 ELSE OPEN "O",2,FIL.OUT$
  211. 3100 PRINT: PRINT SPC(25)"ENCRYPT OR DECRYPT? E/D ";: GOSUB 1460
  212. 3110 OPT.SEL%=N.N%-67: IF OPT.SEL%=1 OR OPT.SEL%=2 THEN 3130
  213. 3120 IF I.E% THEN 3200 ELSE 3100
  214. 3130 IF OPT.SEL%=1 THEN 3140 ELSE GOSUB 1360: IF I.E% THEN 3200
  215. 3140 GOSUB 1380: IF I.E% THEN 3200
  216. 3150 PRINT SPC(25)"PRINT INPUT TEXT? Y/N ";: GOSUB 1460: IF I.E% THEN 3200
  217. 3160 IF N.N%=89 THEN PRT.I%=TRU.ON% ELSE PRT.I%=FAL.OF%
  218. 3170 PRINT SPC(25)"PRINT OUTPUT TEXT? Y/N ";: GOSUB 1460: IF I.E% THEN 3200
  219. 3180 IF N.N%=89 THEN PRT.O%=TRU.ON% ELSE PRT.O%=FAL.OF%
  220. 3190 GOTO 3250
  221. 3200 IF TIM.SW% THEN GOSUB 2540
  222. 3210 PRINT
  223. 3220 PRINT SPC(12)"PRESS ESC TO RETURN TO MENU OR C KEY TO CHANGE OPTIONS ";
  224. 3230 GOSUB 1460: IF I.E% THEN RETURN ELSE 3030
  225. 3240 '      PRINT ROUTINE
  226. 3250 IF PRT.I% OR PRT.O% THEN GOSUB 1440: GOSUB 3540
  227. 3260 CLS: IF FIL.IN$="KEYBD" THEN 3280 ELSE LOCATE 25,20
  228. 3270 PRINT"PRESS ESC TO END PRINT & RETURN TO MENU";
  229. 3280 LOCATE 1,1: LN.PRT%=0: I.PG%=0: CTR.SET%=1: L.L%=0
  230. 3290 IF FIL.IN$="KEYBD" THEN 3300 ELSE IF EOF(1) THEN 3560 ELSE 3320
  231. 3300 L.L%=L.L%+1: GOSUB 1680
  232. 3310 GOSUB 1570: IF CHR.IN%=27 THEN 3560 ELSE ED.IN$=STR.IN$: GOTO 3330
  233. 3320 LINE INPUT #1,ED.IN$
  234. 3330 LEN.STR%=LEN(ED.IN$): LN.W%=(LEN.STR%-1)\80+1
  235. 3340 IF ED.IN$=CTR.SET$ THEN CTR.SET%=1: ED.OUT$=ED.IN$: GOTO 3440
  236. 3350 ' NEXT 5 LINES SUBSTITUTE CHR$(126) FOR CHR$(127) & (7) WHEN LPRINT
  237. 3360 S.TR$=ED.IN$: K.K%=1
  238. 3370 FOR J.J%=1 TO 2: IF J.J%=1 THEN CHR.IN%=7 ELSE CHR.IN%=127
  239. 3380 I.I%=INSTR(K.K%,S.TR$,CHR$(CHR.IN%)): IF I.I%=0 THEN 3400
  240. 3390 MID$(S.TR$,I.I%,1)=CHR$(126): K.K%=I.I%: GOTO 3380
  241. 3400 NEXT J.J%: IF PRT.I% THEN LPRINT S.TR$: LN.PRT%=LN.PRT%+LN.W%
  242. 3410 IF FIL.IN$<>"KEYBD" THEN PRINT S.TR$
  243. 3420 IF TIM.SW% THEN NO.CHAR!=NO.CHAR!+LEN.STR%: GOSUB 2370
  244. 3430 ON OPT.SEL% GOSUB 1910,1900: IF TIM.SW% THEN GOSUB 2380
  245. 3440 IF FIL.OUT$="NOFILE" THEN 3460 ELSE PRINT #2,ED.OUT$
  246. 3450 ' NEXT 4 LINES SUBSTITUTE CHR$(126) FOR CHR$(127) & (7) FOR LPRINT
  247. 3460 K.K%=1: FOR J.J%=1 TO 2: IF J.J%=1 THEN CHR.IN%=7 ELSE CHR.IN%=127
  248. 3470 I.I%=INSTR(K.K%,ED.OUT$,CHR$(CHR.IN%)): IF I.I%=0 THEN 3490
  249. 3480 MID$(ED.OUT$,I.I%,1)=CHR$(126): K.K%=I.I%: GOTO 3470
  250. 3490 NEXT J.J%: IF PRT.O% THEN LPRINT ED.OUT$: LN.PRT%=LN.PRT%+LN.W%
  251. 3500 PRINT ED.OUT$: IF LN.PRT%>=54 THEN GOSUB 3530
  252. 3510 S.TR$=INKEY$: IF S.TR$="" THEN 3290
  253. 3520 IF ASC(S.TR$)=27 THEN 3580 ELSE 3290
  254. 3530 LPRINT CHR$(12);
  255. 3540 LPRINT"IN=";FIL.IN$;TAB(20)"OUT=";FIL.OUT$;TAB(40);DATE$;" ";TIME$;
  256. 3550 I.PG%=I.PG%+1: LPRINT TAB(70)"PAGE";I.PG%: LPRINT"": LN.PRT%=0: RETURN
  257. 3560 IF ED.OUT$=CTR.SET$ THEN 3580
  258. 3570 IF OPT.SEL%=2 AND FIL.OUT$<>"NOFILE" THEN PRINT #2,CTR.SET$
  259. 3580 IF TIM.SW% THEN GOSUB 2450
  260. 3590 CLOSE: GOSUB 1450: IF PRT.I% OR PRT.O% THEN 3600 ELSE 3030
  261. 3600 PRINT: PRINT SPC(25)"SKIP TO TOP OF PAGE? Y/N ";: GOSUB 1460
  262. 3610 IF S.TR$="Y" THEN LPRINT CHR$(12)
  263. 3620 GOTO 3030
  264. 3630 '      LAST LINE PC-CRYP1
  265.